メインコンテンツまでスキップ

モジュール化とパラメータ化

成功するテスト自動化ソリューションは再利用性と保守性が重要な要件です。そのため、フレームワークを迅速に構築し、変更に対応できる能力が不可欠です。

Eggplantで簡潔かつ持続可能なスクリプトを作成し、自動化を行う上でのシンプルなアプローチを実現するための、基本的なベストプラクティスを紹介します。

モジュール機能を構築する際のルールは、次の3つに分けられます:
  1. 繰り返し発生するシナリオの特定
  2. 関数内の関数の再利用
  3. アプローチの簡素化
これを達成するために、以下の方法論を適用する必要があります:

    DO: ✅
  • 関数をより再利用しやすくするためにパラメータを追加する
  • ハンドラを特定の機能に限定する
  • 特定の動作にグループ化する(例:ブラウザ起動ハンドラ、ログインハンドラ、メインメニューを通るハンドラなど)
    Don't ❌
  • ソリューションを過剰に工夫しない - すべてにパラメータが必要ではありません!
  • 一つのハンドラーに全フローのアクションを含めない(例:'テスト開始'のハンドラーに個々のアクションをすべて含めない)

繰り返し発生するシナリオの特定

前述のベストプラクティスのコード例(下記参照)では、ユースケースを通じて以下の3つの主要機能が繰り返し発生しています。

  • ブラウザの起動
  • ドロップダウンとナビゲーション
  • ページ上のナビゲーション
元のテストスクリプト:
繰り返し/主要な動作:

click image:"chrome" // アイコン
waitfor 20, image:"refresh" // アイコン

set the searchRectangle to (0,70,1920,1039) // OCRの最適化
typetext "https://demo.nopcommerce.com/",returnkey
waitfor 20, image:"nopCommerce" // ロゴ

moveto text:"Computers"
wait 1 // OCRの最適化
click text:"Desktops"
wait 1.5 // OCRの最適化
waitfor 20, text:"Categories"

click text:"Digital Storm VANQUISH 3"
wait 1.5 // OCRの最適化
waitfor 20, text:"Digital Storm Vanquish 3 Desktop PC"

click text:"ADD TO CART"
wait 2 // OCRの最適化
waitfor 20,text:"The product has been added to your shopping cart"
ブラウザ起動:
click image:"chrome" // アイコン
waitfor 20, image:"refresh" // アイコン
set the searchRectangle to (0,70,1920,1039) // OCRの最適化
typetext "https://demo.nopcommerce.com/",returnkey
waitfor 20, image:"nopCommerce" // ロゴ
ドロップダウン:
moveto text:"Computers"
wait 1 // OCRの最適化
click text:"Desktops"
wait 1.5 // OCRの最適化
waitfor 20, text:<mark>"Categories"</mark>
ナビゲーション:
click text:"Digital Storm VANQUISH 3"
wait 1.5 // OCRの最適化
waitfor 20, text:"Digital Storm Vanquish 3 Desktop PC"
click text:"ADD TO CART"
wait 2 // OCRの最適化
waitfor 20,text:"The product has been added to your shopping cart"

上記のスクリプトを分析すると、ナビゲーション機能を構築し、参照する操作は、次の実装となります:

関数のナビゲート:関数の呼び出し:
to navigate action, validation
click text:action
wait 1.5 // ページ遷移の一時停止
waitfor 20, text:validation
end navigate
navigate ("Digital Storm VANQUISH 3"),("Digital Storm Vanquish 3 Desktop PC")

navigate ("ADD TO CART"),("The product has been added to your shopping cart")

ナビゲーションフローに変更が必要な場合、ユーザーはスクリプト全体で機能を更新するのではなく、一箇所だけを変更します。

繰り返し使用される関数を作成することにより、自動化の挙動に対する一貫した理解とスクリプト全体での一貫性が得られます。


関数内の関数の再利用

ユースケースでは'ドロップダウン'機能が必要であり、これがさらなるユースケースでも繰り返し使用される可能性が高いため、再利用可能な関数として構築することは理にかなっています。

UI操作を分析すると、ユーザーはメニューに移動してドロップダウンからオプションを選択します - これには部分的にすでに作成されたナビゲート関数を利用することができます。

ドロップダウン関数:関数の呼び出し:
to dropDown menu, action, validation
moveto text:menu
wait 1
navigate (action),(validation)
end dropDown
dropDown ("Computers"),("Desktops"),("Categories")

部品のように関数を使用することで、フレームワークの生成が加速されます。


アプローチの簡素化

最後の関数は'ブラウザを起動し'、ウェブページにアクセスする処理です。これは現在のユースケースでは一度だけ呼び出されていますが、より広範な要件としてクロスブラウザテストが必要であるか、または他のウェブページにアクセスするユースケースが発生する可能性があります。

そのため、ブラウザとURLをパラメータ化したブラウザ起動機能を構築しました:

元のブラウザ起動関数:関数の呼び出し:
to launchBrowser browser,url
click image:"icons/"&browser
waitfor 20, image:"icons/refresh" //アイコン
typetext url,returnkey
waitfor 20, image:"logos" //ロゴ
end launchBrowser
launchBrowser ("chrome"),("https://demo.nopcommerce.com/")

スクリプトへのシンプルかつ簡易な代替案

関数をできるだけシンプルにすることは良い取り組みです。

考慮すべき主要な観点:
  • SUT/AUTが変更された場合はどうするか。
  • テストを拡張する必要がある場合 - アプローチに適応が必要か、更新や拡張が必要か。
  • テストに関与しないシステムに対するテストアセット、例えばOS UIやブラウザUIなどのキャプチャを避ける方法は何か。

この対応例をブラウザ起動スクリプトで示します。現在、Chromeに対してこのスクリプトを実行するために、Chromeアイコンの画像をキャプチャし、ブラウザが起動したことをリフレッシュボタンの画像で検証しています。

FirefoxやEdgeにテストを拡張したい場合はどうでしょうか?新たに4つの画像(各ブラウザのアイコンとリフレッシュボタン)をキャプチャする必要があります。これは小さな工数に思えるかもしれませんが、この関数が全体的なアプローチで利用されている場合、高いメンテナンスコストにつながる可能性があります。この問題は簡単に回避できます。

解決策は、組み込みのSUT機能、例えば「Windows Run」ウィンドウを利用して、ブラウザを直接URLに起動し、AUTのロゴ、この場合はNopCommerceのロゴで検証することです。

ここでは、テスト要件外でキャプチャされた資材(ブラウザアイコンとブラウザリフレッシュボタン)の数を大幅に削減しました。

元のブラウザ起動関数改善されたブラウザ起動関数
to launchBrowser browser,url
click image:"icons/"&browser
waitfor 20, image:"icons/refresh" //アイコン
typetext url,returnkey
waitfor 20, image:"logos" //ロゴ
end launchBrowser
to launchBrowser browser,url
typetext windowskey, "r" // Runウィンドウを起動
wait 1
typetext browser && url, returnkey
waitfor 20, image:"logos" // ロゴ
end launchBrowser

学習の要約

自動化開発の基本とすべきベストプラクティスは、スクリプトを可能な限りモジュラーで再利用可能にすることです。繰り返し発生する機能をグループ化し、パラメータを使用してコードを簡素化することで、スクリプトのメンテナンス性が向上します。

非推奨例
推奨例
テストケース:

// ステップ 1
click image:"chrome" // アイコン
waitfor 20, image:"refresh" // アイコン

set the searchRectangle to (0,70,1920,1039) // OCRの最適化
typetext "https://demo.nopcommerce.com/",returnkey
waitfor 20, image:"nopCommerce" // ロゴ

// ステップ 2
moveto text:"Computers"
wait 1 // OCRの最適化
click text:"Desktops"
wait 1.5 // OCRの最適化
waitfor 20, text:"Categories"

// ステップ 3
click text:"Digital Storm VANQUISH 3"
wait 1.5 // OCRの最適化
waitfor 20, text:"Digital Storm Vanquish 3 Desktop PC"

// ステップ 4
click text:"ADD TO CART"
wait 2 // OCRの最適化
waitfor 20,text:"The product has been added to your shopping cart"

// ステップ 5
moveto image:"Basket"
wait 1
click text:"GO TO CART"
wait 2 // OCRの最適化
waitfor 20, text:"Shopping Cart"
assert that imagefound(0,text:"Digital Storm VANQUISH 3 Custom Performance PC")

テストケース:
// ステップ 1
launchBrowser ("chrome"),("https://demo.nopcommerce.com/")
set the searchRectangle to (0,70,1920,1039)
// ステップ 2
dropDown ("Computers"),("Desktops"),("Categories")
// ステップ 3
navigate ("Digital Storm VANQUISH 3"),("Digital Storm Vanquish 3 Desktop PC")
// ステップ 4
navigate ("ADD TO CART"),("The product has been added to your shopping cart")
// ステップ 5
dropDown ("Shopping cart"),("GO TO CART"),("Shopping Cart")
// 終了
メソッド/関数:
// ブラウザを起動する関数
to launchBrowser browser,url
set global browser to browser
typetext windowskey,"r"
wait 1
typetext browser&&url,returnkey
waitfor 20, image:"logos" // ロゴ
end launchBrowser

// ドロップダウンを開始して選択する関数
to dropDown menu,action,validation
moveto text:menu,searchRectangle:config().browser.(global browser)
wait 1
navigate (action),(validation)
end dropDown

// アクションと検証フレームワークを使用してナビゲートする関数
to navigate action,validation
click text:action,searchRectangle:config().browser.(global browser)
wait 1.5 // ページ遷移
waitfor 20, text:validation,searchRectangle:config().browser.(global browser)
end navigate
画像フォルダ:

画像フォルダ: